package com.sudo.boot.netty.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToByteEncoder;

import java.util.List;

public class MessageDecoder extends ByteToMessageDecoder {

    private int length = 0;
    /**
     *
     * @param channelHandlerContext
     * @param byteBuf 客户端编码后的消息
     * @param list list里的数据会被放行到下一个handler，把解码出来的MessageProtocol放到list里
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        System.out.println("byteBuf = " + byteBuf);
        // 获取前面4个字节的数据=== 描述实际内容的长度
        if (byteBuf.readableBytes() < 4) {
            return;
        }
        // >= 4 byteBuf里可能有MessageProtocol数据
        if (length == 0) {
            length = byteBuf.readInt();
        }
        if (byteBuf.readableBytes() < length) {
            // 如果数据小于length，说明数据还没完全到达
            System.out.println("当前数据数量不够");
            return;
        }
        // 刻度数据>=length, ==> 意味着刻度数据都可以拿到
        byte[] data = new byte[length];
        // 把byteBuf里的指定长度数据读到data数组中
        byteBuf.readBytes(data);
        MessageProtocol protocol = new MessageProtocol();
        protocol.setContent(data);
        protocol.setLength(length);

        list.add(protocol);
        // 重置length
        length = 0;
    }
}
